package com.xpp.yanbi.manager;

import com.xpp.yanbi.common.ErrorCode;
import com.xpp.yanbi.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
/**
 * 专门提供 RedisLimiter 限流基础服务的（提供了通用的能力,放其他项目都能用）
 */
@Service
public class RedisLimiterManager {
    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     *
     * @param key 区分不同的限流器，比如不同的用户ID 应该分别统计
     */
    public void doRateLimit(String key){
        // 创建一个名称 user_limiter 的限流器，每秒最多访问 2 次
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        // 限流器的统计规则（一个用户最多每秒 2 个请求）
        // RateType.OVERALL 表达速率限制作用整个令牌桶，限制所有请求的速率
        rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
        // 每当一个操作来了，请求一个令牌。
        //  rateLimiter.trySetRate(RateType.OVERALL,5,1, RateIntervalUnit.SECONDS);
        // 上诉就可以 vip可以设置 1，普通用户设置5
        boolean canOp = rateLimiter.tryAcquire(1);
        if (!canOp){
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
        }
    }
}


